/*
 * 构造南瑞继保103报文命令的类
 * 1.读定值（通用分类服务，ASDU10，ASDU21）
 * 2.修改定值(通用分类服务，ASDU10）
 * 3.读取软压板（通用分类服务ASDU10,ASDU21）
 * 4.修改软压板（通用分类服务，ASDU10）
 * */
#include <QByteArray>
#include "SF103_Type.h"
#include "PacketConstructer.h"
#include "SF103_Parser.h"

#ifndef SF103CONSTRUCTER_H
#define SF103CONSTRUCTER_H
class SF103Constructer
{
public:
   SF103Constructer();
   virtual ~SF103Constructer();

    // 设备心跳报文， 参数源设备地址为 本机ip地址的最后一个字段
   QByteArray constructHeartPacket(ushort srcDevAddr, ushort destDevAddr);

   /*
    * @Des: 根据传入的组号和 kod 构造读取信息命令
    * @para: 源设备地址，目标设备设备地址，整形组号，kod类型
    * */
   QByteArray constructReadGroupInfo(ushort srcDevAddr, ushort destDevAddr,const QString &groupNo, const QString &KOD);

   // 传入参数 完整的 ip 地址
   QByteArray constructReadAllTitles(QString srcDevAddr, QString destDevAddr);

    //构造读取所有组标题的报文命令
   QByteArray constructReadAllTitles(ushort srcDevAddr, ushort destDevAddr);

   // 15 读取定值区报文构造
   QString constructReadSettingArea();

   // 帧校验和计算
   uint8_t SumCheck( const char* packet, int32_t length );
   uint8_t SumCheck( const QString& packet, int32_t length );
   uint8_t SumCheck( const QByteArray& packet, int32_t length );

   // 将 APCI 结构体转换为 QByteArray
   QByteArray apciToByteArray(SF_APCI_Frame apci);

private:
   //apci 部分
   SF_APCI_Frame m_apci;
   PacketConstructer *m_asduConstructer;
   unsigned m_cpuAddr;   // 默认给通用广播地址，实际是保护ip地址最后一个字段
};

#endif // SF103Constructer


